package com.laivi.basic.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author laivi.zhu@gmail.com
 * @date 2013-11-22
 * description:日期处理封装方法工具类
 */
public class DateUtil {
	public static final String YEAR="yyyy";
	public static final String MONTH="MM";
	public static final String DATE="dd";
	public static final String HOUR="HH";
	public static final String MIN="mm";
	public static final String SECOND="ss";
	public static final String YEAR_MONTH="yyyy-MM";
	public static final String MONTH_DAY="MM-dd";
	public static final String DAY="yyyy-MM-dd";
	public static final String DAY_TIME="yyyy-MM-dd HH:mm:ss";
	public static final String DAY_HOUR_MIN="yyyy-MM-dd HH:mm";
	public static final String TIME="HH:mm:ss";
	public static final String HOUR_MIN="HH:mm";
	
	/**
	 * 格式化日期,将日期类型转换成特定的日期字符串
	 * @date 2013-11-22
	 * @param date:需要转换成的日期
	 * @param format:需要转换成的日期格式字符串
	 * @return:需要的日期字符串
	 */
	public static String format(Date date,String format){
		if(date==null){
			return "";
		}
		DateFormat df=null;
		try{
			df = new SimpleDateFormat(format);
		}catch(Exception e){
			return "";
		}
		return df.format(date);
	}
	
	/**
	 * 格式化日期,将日期类型转换成"yyyy-MM-dd HH:mm:ss"的日期字符串
	 * @date 2013-11-22
	 * @param date
	 * @return
	 */
	public static String format(Date date){
		return DateUtil.format(date, DateUtil.DAY_TIME);
	}
	/**
	 * 格式化日期格式,将特定格式的日期字符串转换成日期类型
	 * @date 2013-11-22
	 * @param date:特定格式的日期字符串
	 * @param format：日期字符串的日期格式
	 * @return:返回字符串的日期类型
	 */
	public static Date format(String date,String format){
		if(date==null||"".equals(date)){
			return null;
		}
		try{
			DateFormat df = new SimpleDateFormat(format);
			return df.parse(date);
		}catch(Exception e){
			return null;
		}
	}
	
	/**
	 *  格式化日期格式,将"yyyy-MM-dd HH:mm:ss"格式的日期字符串转换成日期类型
	 * @date 2013-11-22
	 * @param date
	 * @return
	 */
	public static Date format(String date){
		return DateUtil.format(date,DateUtil.DAY_TIME);
	}
	
	/**
	 * 对日期进行特定的时间位数的增加或是减少
	 * @date 2013-11-22
	 * @param date：需要处理的日期
	 * @param timeType：需要变化的日期区域，可以是Calendar.Year,Month,Day,Hour,Minute,Second,DAY_OF_WEEK
	 * @param timeCount:需要变化的值，正数是增加，负数是减少
	 * @return：处理后的日期
	 */
	public static Date addTime(Date date,int timeType,int timeCount){
		if(date==null){
			return null;
		}
		Calendar cal=Calendar.getInstance();
		cal.setTime(date);
		cal.add(timeType, timeCount);
		return cal.getTime();
	}
	
	/**
	 *  对当前时间进行特定的时间位数的增加或是减少
	 * @date 2013-11-22
	 * @param timeType：需要变化的日期区域，可以是Calendar.Year,Month,Day,Hour,Minute,Second,DAY_OF_WEEK
	 * @param timeCount:需要变化的值，正数是增加，负数是减少
	 * @return：处理后的日期
	 */
	public static Date addTime(int timeType,int timeCount){
		return DateUtil.addTime(new Date(), timeType, timeCount);
	}
	
	/**
	 * 获取两时间之间特定时间区域的差值
	 * @date 2013-11-22
	 * @param start：开始时间
	 * @param end:结束时间
	 * @param timeType:特定的时间区域，可以是Calendar.Year,Month,Day,Hour,Minute,Second,DAY_OF_WEEK
	 * @return:返回差值
	 */
	public static long subTime(Date start,Date end,int timeType){
		long sub=(end.getTime()-start.getTime())/1000;
		long result=0;
		Calendar startCal=Calendar.getInstance();
		startCal.setTime(start);
		Calendar endCal=Calendar.getInstance();
		endCal.setTime(end);
		switch(timeType){
		case Calendar.YEAR:
			result=endCal.get(Calendar.YEAR)-startCal.get(Calendar.YEAR);
			break;
		case Calendar.MONTH:
			result=endCal.get(Calendar.YEAR)*12+endCal.get(Calendar.MONTH)-startCal.get(Calendar.YEAR)*12-startCal.get(Calendar.MONTH);
			break;
		case Calendar.DATE:
			result=sub/(60*60*24);
			break;
		case Calendar.HOUR:
			result=sub/(60*60);
			break;
		case Calendar.MINUTE:
			result=sub/60;
			break;
		case Calendar.SECOND:
			result=sub;
			break;
		default:
			break;
		}
		return result;
	}
	
	/**
	 * 获取日期的特定是区域
	 * @date 2013-11-22
	 * @param date：日期
	 * @param timeType：特定的时间区域，可以是Calendar.Year,Month,Day,Hour,Minute,Second,DAY_OF_WEEK
	 * @return
	 */
	public static int getTime(Date date,int timeType){
		Calendar cal=Calendar.getInstance();
		if(date!=null){
			cal.setTime(date);
		}
		if(timeType==Calendar.DAY_OF_WEEK){
			int result=cal.get(timeType);
			if(result==1){
				result=7;
			}else{
				result--;
			}
			return result;
		}
		return cal.get(timeType);
	}
	
	/**
	 * 获取当前时间的特定是区域
	 * @date 2013-11-22
	 * @param timeType：特定的时间区域，可以是Calendar.Year,Month,Day,Hour,Minute,Second,DAY_OF_WEEK
	 * @return
	 */
	public static int getTime(int timeType){
		return DateUtil.getTime(null,timeType);
	}
	
	/**
	 * 获取特定时间的月末
	 * @date 2013-11-22
	 * @param date：该时间的月末
	 * @return：月末
	 */
	public static Date getLastDayOfMonth(Date date){
		Calendar cal=Calendar.getInstance();
		if(date!=null){
			cal.setTime(date);	
		}
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.add(Calendar.MONTH,1);
		cal.add(Calendar.DAY_OF_YEAR, -1);
		return cal.getTime();
	}
	
	/**
	 * 获取当前时间的月末
	 * @date 2013-11-22
	 * @return：月末
	 */
	public static Date getLastDayOfMonth(){
		return DateUtil.getLastDayOfMonth(null);
	}
	
	/**
	 * 获取特定日期的星期字符串
	 * @date 2013-11-25
	 * @param date
	 * @return
	 */
	public static String getWeek(Date date){
		String[] weeks={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
		return weeks[DateUtil.getTime(date,Calendar.DAY_OF_WEEK)-1];
	}
	
	/**
	 * 获取当前时间的星期字符串
	 * @date 2013-11-25
	 * @return
	 */
	public static String getWeek(){
		return DateUtil.getWeek(null);
	}
	
	/**
	 * 获取特定时间所在月份的天数
	 * @date 2013-11-26
	 * @param date：特定的时间
	 * @return
	 */
	public static int getDaysOfMonth(Date date){
		return DateUtil.getTime(DateUtil.getLastDayOfMonth(date), Calendar.DAY_OF_MONTH);
	}
	
	/**
	 * 获取当前时间所在月份的天数
	 * @date 2013-11-26
	 * @return
	 */
	public static int getDaysOfMonth(){
		return DateUtil.getDaysOfMonth(null);
	}
	
	/**
	 * 根据年和月获取当月的天数
	 * @date 2013-12-17
	 * @param year
	 * @param month
	 * @return
	 */
	public static int getDaysOfMonth(int year,int month){
		Calendar cal=Calendar.getInstance();
		cal.set(year, month, 1);
		cal.add(Calendar.DAY_OF_YEAR, -1);
		return DateUtil.getDaysOfMonth(cal.getTime());
	}
	
	/**
	 * 判断是否为闰年
	 * @date 2013-12-6
	 * @param year
	 * @return
	 */
	public static boolean isLeapYear(int year){
		if((year%4==0)&&((year%100)!=0)) return true;
		return false;
	}
}
